/*
 * Portions Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This software may be used and distributed according to the terms of the
 * GNU General Public License version 2.
 */

/*
 charencode.h - miscellaneous character encoding

 Copyright Olivia Mackall <olivia@selenic.com> and others

 This software may be used and distributed according to the terms of
 the GNU General Public License, incorporated herein by reference.
*/

#ifndef _HG_CHARENCODE_H_
#define _HG_CHARENCODE_H_

#include <Python.h> // @manual=fbsource//third-party/python:python
#include "eden/scm/sapling/compat.h"

/* This should be kept in sync with normcasespecs in encoding.py. */
enum normcase_spec {
  NORMCASE_LOWER = -1,
  NORMCASE_UPPER = 1,
  NORMCASE_OTHER = 0
};

PyObject* unhexlify(const char* str, Py_ssize_t len);
PyObject* isasciistr(PyObject* self, PyObject* args);
PyObject* asciilower(PyObject* self, PyObject* args);
PyObject* asciiupper(PyObject* self, PyObject* args);
PyObject* make_file_foldmap(PyObject* self, PyObject* args);
PyObject* jsonescapeu8fast(PyObject* self, PyObject* args);

static const int8_t hextable[256] = {
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,  1,  2,  3,  4,  5,
    6,  7,  8,  9,  -1, -1, -1, -1, -1, -1, /* 0-9 */
    -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* A-F */
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10,
    11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* a-f */
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

static inline int hexdigit(const char* p, Py_ssize_t off) {
  int8_t val = hextable[(unsigned char)p[off]];

  if (val >= 0) {
    return val;
  }

  PyErr_SetString(PyExc_ValueError, "input contains non-hex character");
  return 0;
}

#endif /* _HG_CHARENCODE_H_ */
